package com.b511.swpu.cementbackend.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class UnZipUtil {
    public static boolean unZip(File zipFile, String descDir) {
        boolean flag = false;
        File pathFile = new File(descDir);
            if (!pathFile.exists()) {
            pathFile.mkdirs();
        }
        ZipFile zip = null;
            try {
            // 指定编码，否则压缩包里面不能有中文目录
            zip = new ZipFile(zipFile, Charset.forName("gbk"));
            for (Enumeration entries = zip.entries(); entries.hasMoreElements();) {
                ZipEntry entry = (ZipEntry) entries.nextElement();
                String zipEntryName = entry.getName();
                InputStream in = zip.getInputStream(entry);
                String outPath = (descDir + zipEntryName).replace("/",
                        File.separator);
                // 判断路径是否存在,不存在则创建文件路径
                File file = new File(outPath.substring(0,
                        outPath.lastIndexOf(File.separator)));
                if (!file.exists()) {
                    file.mkdirs();
                }
                // 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
                if (new File(outPath).isDirectory()) {
                    continue;
                }

                OutputStream out = new FileOutputStream(outPath);
                byte[] buf1 = new byte[2048];
                int len;
                while ((len = in.read(buf1)) > 0) {
                    out.write(buf1, 0, len);
                }
                in.close();
                out.close();
            }
            flag = true;
            // 必须关闭，否则无法删除该zip文件
            zip.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
            return flag;
}

//    说明：RAR 5.0及以下的版本可以解压，RAR 5.0以上的版本不能解压报如下异常，
//            * exception in archive constructor maybe file is encrypted or currupt
//     * com.github.junrar.exception.RarException: badRarArchive

//    public static void unRar(File rarFile, String outDir) throws Exception {
//        File outFileDir = new File(outDir);
//        if (!outFileDir.exists()) {
//            boolean isMakDir = outFileDir.mkdirs();
//            if (isMakDir) {
//                System.out.println("创建压缩目录成功");
//            }
//        }
//        Archive archive = new Archive(new FileInputStream(rarFile));
//        FileHeader fileHeader = archive.nextFileHeader();
//        while (fileHeader != null) {
//            if (fileHeader.isDirectory()) {
//                fileHeader = archive.nextFileHeader();
//                continue;
//            }
//            File out = new File(outDir + fileHeader.getFileNameString());
//            if (!out.exists()) {
//                if (!out.getParentFile().exists()) {
//                    out.getParentFile().mkdirs();
//                }
//                out.createNewFile();
//            }
//            FileOutputStream os = new FileOutputStream(out);
//            archive.extractFile(fileHeader, os);
//
//            os.close();
//
//            fileHeader = archive.nextFileHeader();
//        }
//        archive.close();
//    }

    //服务器需要安装winrar
    public static final String winrarPath = "C://Program Files//WinRAR//WinRAR.exe";
    public static boolean unRar(String rarFile, String target) {
        boolean bool = false;
        File f = new File(rarFile);
        if (!f.exists()) {
            return false;
        }
        //创建target地址的文件夹，将解压后的文件放于此
        File targetFile=new File(target);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }
        String cmd = winrarPath + " X " + rarFile + " " + target;
        try {
            Process proc = Runtime.getRuntime().exec(cmd);
            if (proc.waitFor() != 0) {
                if (proc.exitValue() == 0) {
                    bool = false;
                }
            } else {
                bool = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bool;
    }
}
